#include <iostream>
#include <stack>
#include<vector>
using namespace std;
int a, b;
stack<pair<int, int>>res;//用stack<pair> 储存路径点位

bool isable(vector<vector<int>>board, int i, int j) {
    if (i == a - 1 && j == b - 1) { //终点
        res.push(make_pair(i, j)); //入栈
        return true;
    }
    //这个点不是通往最短路径的条件
    if (i >= a || j >= b || i < 0 || j < 0)
        return false;
    if (board[i][j])
        return false;
    board[i][j] = 1; //代表这个点已经走过 不能往回走
    if (isable(board, i + 1, j) || isable(board, i, j + 1) ||
            isable(board, i - 1, j) || isable(board, i, j - 1)) { //四个方向走
        //优先向左 或 下走 即是最短路径上的点
        res.push(make_pair(i, j)); //入栈
        return true;
    }
    return false;
}
int main() {
    while (cin >> a >> b) { // 注意 while 处理多个 case
        //初始化棋盘
        vector<vector<int>>board;
        board.resize(a);
        for (int i = 0; i < a; i++)
            board[i].resize(b, 0);
        for (int i = 0; i < a; i++)
            for (int j = 0; j < b; j++)
                cin >> board[i][j];
        //获取最优路径
        isable(board, 0, 0);
        //出栈输出
        while (!res.empty()) {
            printf("(%d,%d)\n", res.top().first, res.top().second);
            res.pop();
        }
    }
    return 0;
}